<?php
/** 
 * @brief Session_Handler_Redis类
 * @note 使用Redis存储Session数据
 */
class Session_Handler_Redis implements Session_Handler {
    /** 
     * Session_Handler_Redis实例
     *
     * @var object 
     */
    protected static $instance = null;

    /** 
     * Session的有效时间(单位为秒)
     *
     * @var int 
     */
	public $lifetime;

    /** 
     * Redis实例
     * 
     * @var object 
     */
	public $handler;

    /**
     * 构造函数
     * 
     * @note 打开Redis连接
     * @param int $lifetime Session的有效时间(单位为秒)
     * 
     * @return void
     */
    private function __construct($lifetime = 3600) {
        $this->handler = new \Cache\Redis();
        $this->lifetime = $lifetime;
    }

    /**
     * 取得Session_Handler_Redis实例
     * 
     * @note 单件模式
     * @param int $lifetime Session的有效时间(单位为秒)
     * 
     * @return object
     */
    public static function init($lifetime) {
        if (self::$instance === null) {
            self::$instance = new self($lifetime);
        }
        return self::$instance;
    }

    /**
     * Session启动时调用的函数
     * 
     * @param string $sessPath Session数据储存的路径
     * @param string $sessName SessionID储存的变量名
     * 
     * @return boolean
     */
    public function open($savePath, $sessName) {
        return true;
    }
    
    /**
     * Session注销时调用的函数
     * 
     * @return boolean
     */
    public function close() {
        return true;
    }

    /**
     * 读取SESSION数据
     * 
     * @param string $name 指定的变量名
     * 
     * @return mixed
     */
	public function read($name) {
        $key = Session::getSessId() . '_' . $name;
        return $this->handler->get($key);
    }

    /**
     * 写入SESSION数据
     * 
     * @param string $name 指定的变量名
     * @param mixed $value 数据
     * 
     * @return boolean
     */
    public function write($name, $value) {
        $key = Session::getSessId() . '_' . $name;
        return $this->handler->set($key, $value, $this->lifetime); 
	}

    /**
     * 当调用session_destroy()时触发的函数
     * 
     * @param string $sessId SessionID
     * 
     * @return boolean
     */
    public function destroy($sessId) {
        $prefix = $sessId . '_';
        $iterator = NULL;
        while ($keys = $this->handler->scan($iterator, "$prefix*")) {
            if (false !== $keys) {
                $this->handler->delete($keys);
            }
        }
        return true;
    }
    
    /**
     * 清理系统过期的Session数据
     * 
     * @param int $maxLifetime 最大有效时间
     * 
     * @return boolean
     */
    public function gc($maxLifetime) {
        return true;
    }
}
